←
▼
▲
CSV 形式の1項目を取り出し、通常の文字列に戻す。
Function MeltCSV( Line as string, in_out_Start as integer ) as string
i = 1
Do
s = MeltCSV( line, i )
If not IsEmpty( s ) Then (s を使った処理)
If i = 0 Then Exit Do
Loop
【引数】
Line
in_out_Start
CSV 形式の1行
(入力) 取り出しを開始する文字の位置、(出力)次に取り出す〜
返り値
取り出した CSV 形式の1項目。Empty=項目に値が無い
サンプル
(src)
関連
各項目の両端の空白が削除されたものが戻ります。
次の項目が無いときは、i=0 になります。
i=0 を渡すと、Empty を返します。
→ T_CSV.vbs # main
テスト
←
▼
▲
→ T_CSV.vbs
ソース
Function CSV_insert( CSV_Line as string, RightColumnNum0 as integer, Element as variant )
as string
CSV 形式の1行に、要素を挿入します。
【引数】
CSV_Line
RightColumnNum0
CSV 形式の1行
挿入する位置の右の要素の番号(0以上)
テスト
→ vbslib.vbs
挿入した後の CSV 形式の1行
挿入する要素
Element
返り値
サンプル
Assert CSV_insert( "A,B,C", 1, "x" ) = "A,x,B,C"
Assert CSV_insert( "A,B,C", 4, "x" ) = "A,B,C,,x"
←
▼
▲
→ T_CSV.vbs
ソース
Function CSV_set( CSV_Line as string, ColumnNum0 as integer, Element as variant )
as string
CSV 形式の1つの要素を上書きします。
【引数】
CSV_Line
ColumnNum0
CSV 形式の1行
上書きする要素の番号(0以上)
テスト
→ vbslib.vbs
上書きした後の CSV 形式の1行
上書きする要素
Element
返り値
サンプル
Assert CSV_set( "A,B,C", 1, "x" ) = "A,x,C"
Assert CSV_set( "A,B,C", 4, "x" ) = "A,B,C,,x"
←
▼
▲
→ T_CSV.vbs
ソース
Function CSV_remove( CSV_Line as string, ColumnNum0 as integer ) as string
CSV 形式の1つの要素を削除します。
【引数】
CSV_Line
ColumnNum0
CSV 形式の1行
削除する要素の番号(0以上)
テスト
→ vbslib.vbs
削除した後の CSV 形式の1行
返り値
サンプル
Assert CSV_remove( "A,B,C", 1 ) = "A,C"
Assert CSV_remove( "A,B,C", 4 ) = "A,B,C,"
Assert CSV_remove( "A,B,C,", 3 ) = "A,B,C"
削除する要素より前の要素が無いときは、前に空の要素が追加されます
←
▼
▲
(src)
Function LoadXML( PathOrStr as string, Opt as variant ) as IXMLDOMElement
XML ファイル、または XML 形式の文字列を読み込みます。
【引数】
PathOrStr
XML ファイルのパス、または XML 形式文字列や
Opt
オプション(下記)
IXMLDOMElement
XML のルート要素
返り値
F_NoRoot フラグ、g_VBS_Lib.NoRootXML
XML のルート要素が無い XML を読み込みます。 返り値は、内部で自動的に
加えられたルート要素 <Dummy_Root_> になります。
先頭が < でないときは、自動的にルート要素が加えられます。
F_Str フラグ、g_VBS_Lib.StringData
PathOrStr 引数を XML 形式文字列として処理します
サンプル: XML 形式文字列を展開する
Dim s : s = "ABC <TAG1 attr='value1'/> 123"
Dim root : Set root = LoadXML( s, F_NoRoot or F_Str )
Dim value : value = root.selectSingleNode( "./TAG1" ).getAttribute( "attr" )
'// value = "value1"
関連
LoadXML
Dim root, elem, attr
Set root = LoadXML( "sample.xml", Empty )
'//=== read 1 attribute value
WScript.Echo root.selectSingleNode( "./Tests/Test" ).getAttribute( "result" )
'//=== read 1 text value
WScript.Echo root.selectSingleNode( "./Tests" ).text
Set node = root.selectSingleNode( "./Tests/text()" )
If not node is Nothing Then WScript.Echo node.nodeValue
'//=== loop each tags
For Each element In root.selectNodes( "./Tests/Test" )
WScript.Echo "result, "+ element.getAttribute( "result" )
Next
Set nodes = root.selectNodes( "./Tests" )
ReDim values( nodes.length - 1 )
For i=0 To UBound( values )
values(i) = nodes(i).text
Next
'//=== loop each attributes
For Each element In root.selectNodes( ".//Test" )
WScript.Echo "<" + element.tagName + ">"
For Each attribute In element.attributes
WScript.Echo attribute.name + "=" + attribute.value
Next
Next
"sample.xml"
"./Tests/Test"
"./Tests/Test"
"result"
"result"
".//Test"
result
→ DOM サンプル
LoadXML
日本語があるときは、Unicode にするか、XML宣言で Shift-JIS を指定してください。
→ XmlFilter ツール (.zip)
テスト
→ T_XML フォルダー
サンプル: XML を結合する
Dim f, root, elem, attr
Set f = OpenForWrite( "FileAB.xml", Empty )
f.WriteLine "<TabA>"
Set root = LoadXML( "FileA.xml", Empty )
f.WriteLine XmlTags( root.selectSingleNode( "./TagB" ).xml, 1 )
Set root = LoadXML( "FileB.xml", Empty )
f.WriteLine XmlTags( root.selectSingleNode( "./TagB" ).xml, 1 )
f.WriteLine "</TabA>"
→ XML
参考
./Tests/text()
関連
selectSingleNode
selectNodes
getAttribute
SuperClass タグの属性を子タグにコピーして、id 属性を持たない SuperClass タグを
削除した XML データを返します。 super_class 属性を持つタグは、super_class 属性が
指す id 属性を持つ SuperClass タグの属性をコピーします。
参考: T_InheritSuperClassXML テスト
<SuperClass priority="1000">
<File path="*.c"/>
<File path="*.h"/>
</SuperClass>
<SuperClass priority="2000" id="Super1"/>
<File path="*.cpp" super_class="#Super1"/>
<File path="*.c" priority="1000"/>
<File path="*.h" priority="1000"/>
<SuperClass priority="2000" id="Super1"/>
<File path="*.cpp" super_class="#Super1" priority="2000"/>
FileA.xml ファイル
LoadXML の返り値の XML
←
▼
▲
Function LoadXML_Cached( PathOrStr as string, Opt as variant ) as IXMLDOMElement
IXMLDOMElement
XML を解析してできた DOM オブジェクトをキャッシュする
。
返り値がどの変数から参照されなくなっても、キャッシュのために、DOM オブジェクトはメモリー上に
残ります。 vbslib の内部に絶対パスをキー、DOM オブジェクトをアイテムとした辞書型のキャッシュ
があります。
ソース
→ vbslib.vbs
2回目以降の XML ファイルは、キャッシュによって XML を解析する処理がなくなり、高速に処理
します。
関連
キャッシュは、以下の変数です。
g_VBS_Lib.XML_DOM_ReadCache as dictionary key=path, item=IXMLDOMElement class
←
▼
▲
XML ファイルの内容を内部でキャッシュします。
関連
←
▼
▲
Default Property Get XML_ReadCacheClass::Item( URL as string ) as string
XML のテキスト、または、属性値を返します。
【引数】
URL
返り値
XML ファイルのパス +"#"+ XPath
XML のテキスト、または、属性値
サンプル
→ vbslib.vbs
ソース
Set files = new XML_ReadCacheClass
tag_text = files( "Sample.xml#/Root/Tag" )
'// tag_text = "The text"
Sample.xml#/Root/Tag
Sample.xml
VBScript
<Root>
<Tag>The text</Tag>
</Root>
→ T_XML.vbs # [T_XML_ReadCacheClass]
テスト
←
▼
▲
関連
Function OpenForReplaceXML( SrcPath as string, DstPath as string ) as ReplaceXmlFile1
XMLファイルの内容の変更を開始します。
【引数】
SrcPath
DstPath
変更前のテキストファイルのパス
変更後のテキストファイルのパス。 SrcPath と同じ、または Empty 可。
返り値
Set xml = OpenForReplaceXML( "file1.xml", Empty )
xml.Write "/Root/Elem/@attr1", 11
xml.IsUserConfirm = True
xml = Empty '// デストラクタでユーザーの確認およびファイルの更新をする
file1.xml
/Root/Elem/@attr1
11
テスト
→ T_XML.vbs # [T_OpenForReplaceXML]
タグの間のテキスト、または XML 属性の値を変更します。
XML ファイルを変更する前に、ユーザーに確認をとるかどうか。
→ T_XML_Manually.vbs # [T_OpenForReplaceXML_Manually]
→ vbslib.vbs
サンプル
ソース
←
▼
▲
Sub ReplaceXmlFile1::Write( XPath as string, Value as string )
→ サンプル
XML のタグの間のテキスト、または XML の属性の値を変更します。
【引数】
XPath
タグの間のテキスト、または XML の属性の位置を表す XPath
返り値
変化があったかどうか
変更後のテキストまたは XML 属性の値、""=値なし、Empty=削除する
Value
参考
←
▼
▲
Sub ReplaceXmlFile1::SetXmlAttribute( XPathForXmlElement as string, AttrName as string,
AttrValue as string );
XML 属性の値を変更します。
【引数】
XPathForXmlElement
AttrName
属性を変更する XML 要素(タグ) への XPath。 フル・パス
XML 属性の名前
AttrValue
変更後の XML 属性の値
→ サンプル
廃止されました。
←
▼
▲
Dim ReplaceXmlFile1::IsUserConfirm as boolean
XML ファイルを変更する前に、ユーザーに確認をとるかどうかの設定値。
XML ファイルを更新する直前で、値が変わる属性とその値を表示します。
表示中に、ユーザーの確認入力があるまで待ちます。
デフォルトは、False です。
/Root/Tests/Test1@attr1="1"
/Root/Tests/Test3@attr1="3"
更新ファイル:out.xml
XML ファイルの上記属性を変更します。
続行するには Enter キーを押してください . . .
確認画面の例:
→ サンプル
←
▼
▲
Function OpenForAppendXml( SrcPath as string, DstPath as string ) as AppendXmlFile
XMLファイルの内容の追加を開始します。
【引数】
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じですが、
WriteXml メソッドが追加されています。
Modify.xml (処理前)
Modify.xml (処理後)
<Modify>
<Child1 value="1"/>
</Modify>
クローズするときに、ルートの XML タグ(XML要素)を閉じるタグを出力します。
よって、追加する内容は、ルートの XML タグの直下の末尾に限定されます。
Set file = OpenForAppendXml( "Modify.xml", Empty )
file.WriteLine "<Child2 value=""2""/> <!-- by WriteLine -->"
file.WriteXml ReadFile( "Add.xml" )
file = Empty
サンプル
<Modify>
<Child1 value="1"/>
<Child2 value="2"/> <!-- by WriteLine -->
<AddChild value="3"/>
</Modify>
<Add>
<AddChild value="3"/>
</Add>
Add.xml
追加する内容は、OpenForWrite と同様に WriteLine などのメソッドに XML の文字列を
指定します。 XPath ではありません。
テスト
→ T_XML.vbs # [T_OpenForAppendXml]
SrcPath
DstPath
変更前のテキストファイルのパス
変更後のテキストファイルのパス。 SrcPath と同じ、または Empty 可。
返り値
TextStream + α のオブジェクト
(src)
←
▼
▲
Sub AppendXmlFile::WriteXml( Xml as string )
指定した XML 文字列から、ルート XML タグを除いて追加します。
【引数】
Xml
追加する XML 文字列
file.WriteXml "<Root><Child/><Root>"
サンプル
サンプル
OpenForAppendXml( "Modify.xml", Empty ).WriteXml ReadFile( "Add.xml" )
<Child/> を追加します
Modify.xml に Add.xml を追加します。
Modify.xml (処理前)
Modify.xml (処理後)
<Modify>
<Child1 value="1"/>
</Modify>
<Modify>
<Child1 value="1"/>
<AddChild value="2"/>
</Modify>
<Add>
<AddChild value="2"/>
</Add>
Add.xml
(src)
←
▼
▲
文字列の中にある XML要素の文字位置を調べます。 内部で
Set xml = new PositionOfXML_Class
xml.Load "Data.xml"
Set test_tag = xml.SelectSingleNode( "//Tag[1]" )
current_pos = test_tag.PositionOfLeftOfStartTag
next_pos = test_tag.PositionOfNextOfEndTag
Set file = OpenForReplace( "Data.xml", Empty )
text_0 = Left( file.Text, current_pos - 1 )
text_1 = Mid( file.Text, current_pos, next_pos - current_pos )
text_2 = Mid( file.Text, next_pos )
file.Text = text_0 + _
vbTab +"<Test"+ vbCRLF +"name=""A""/>"+ vbCRLF + _
text_1 + _
vbTab +"<Test"+ vbCRLF +"name=""B""/>"+ _
text_2
file = Empty
サンプル
Data.xml
<X><Tests>
<Test
name="0"/>
<Test
name="1"/>
</Tests></X>
<X><Tests>
<Test
name="A"/>
<Test
name="0"/>
<Test
name="B"/>
<Test
name="1"/>
</Tests></X>
<Test
<Test
<Test"+ vbCRLF +"name=""A""/>
<Test"+ vbCRLF +"name=""B""/>
name="B"/>
name="A"/>
MS-XML の DOM では、以下のように整形された XML しか保存できません。
<X>
<Tests>
<Test name="A"/>
<Test name="0"/>
<Test name="B"/>
<Test name="1"/>
</Tests>
</X>
上記スクリプトは、たとえば以下の編集を行います。
テスト
→ T_XML.vbs
T_PositionOfXML
ソース
→ vbslib.vbs
関連
XML要素を追加・変更・削除しても、空白の数や属性の順番が変わって、
XML 文書が崩れてしまうという XML規格の問題を回避することができます。
DOM
は使っていません。
T_PositionOfXML_TryUI
←
▼
▲
Sub PositionOfXML_Class::Load( in_FilePath as string )
XML ファイルをロードします。
【引数】
in_FilePath
ロードする XML ファイルのパス
ソース
→ vbslib.vbs
←
▼
▲
Function PositionOfXML_Class::SelectSingleNode( in_XPath as string )
as PositionOfXML_ElementClass
指定した XML 要素を探して、その位置情報にアクセスするオブジェクトを返します。
【引数】
in_XPath
XML 要素を指す XPath。 ただし一部の形式のみ
ソース
→ vbslib.vbs
in_XPath 引数に指定できる
返り値
XML の位置情報にアクセスするオブジェクト または Nothing
//Tag[1]
//Tag[last()]
開始タグまたは空要素タグの行頭または前のタグの直後の文字の位置
integer
integer
.PositionOfNextOfStartTag
以下は、まだ開発されていません。
integer
.PositionOfLeftOfFirstAttribute
.PositionOfNextOfLastAttribute
integer
integer
終了タグまたは空要素タグの次の行の先頭または終了タグの直後の文字の位置
開始タグの次の行の先頭または開始タグの直後の文字の位置
最初の属性の行頭またはタグ名の直後の文字の位置
最後の属性の次の行の先頭または最後の属性の直後の文字の位置
参考
以下のプロパティから、XML タグの前後などの文字の位置を取得できます。
文字の位置は、VB の InStr 関数などで扱う位置と同じで、先頭が 1 で、文字単位で +1 した整数値です。
ファイルのバイナリの位置とは異なります。
* <Tag>
<Sub/>
</Tag>
+
*
<Previous/>* <Tag/>+ <Next/>
同じ行に別のタグがないとき:
同じ行に別のタグがあるとき:
+
* = PositionOfLeftOfStartTag が指す文字
+ = PositionOfNextOfEndTag が指す文字
*
+
厳密にいえば、同じ行に別のタグがあるかどうかではなく、
タグの左の位置のプロパティは、同じ行の左側に別のタグがるかどうか、
タグの次の位置のプロパティは、同じ行の右側に別のタグがるかどうかです。
同じ行の右側に別のタグがあっても、タグの左の位置のプロパティは、
上記の「同じ行に別のタグがないとき」に該当します。
+ = PositionOfNextOfEndTag が指す文字
* = PositionOfLeftOfStartTag が指す文字
XPath
は、以下の形式のみです。
該当する XML 要素がなければ、Nothing を返します。
[ ] の中は、1以上の整数です。 要素数(=last()) より大きいときは、Nothing を返します。
←
▼
▲
Function XmlRead( in_BaseXmlElement as IXMLDOMElement, in_XPath as string ) as string
XML のタグの間のテキスト、または XML の属性の値を取得します。
【引数】
in_BaseXmlElement
in_XPath
in_XPath の基準となる XML要素(タグ)
タグの間のテキスト、または XML の属性の位置を表す in_XPath
返り値
テキストまたは XML 属性の値。文字列型
タグの間のテキストは、厳密には in_XPath = "/Root/Elem/text()" ですが、in_XPath =
"/Root/Elem" を指定してください。
in_XPath に指定したタグ(XML要素)やXML属性が存在しないときは、Empty を返します。
in_XPath が相対パスのときは、in_BaseXmlElement のタグが基準になります。
in_XPath にフル・パスを指定することもできます。
参考
テスト
→ T_XML.vbs
→ getAttribute (IXMLDOMElement)
サンプル
Set root = LoadXML( "in.xml", Empty ) '// as IXMLDOMElement
value = XmlRead( root, "./Tag1/@attr1" )
Tag1/@attr1
XmlRead
関連
XML のタグの間の複数行のテキスト
ソース
→ vbslib.vbs
T_XmlRead
#付き RUL、name 属性、id 属性